# from langchain import SerpAPIWrapper 
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain_ollama import ChatOllama
from langchain_tavily import TavilySearch
import os
os.environ["TAVILY_API_KEY"] = "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"

llm = ChatOllama(
    model="deepseek-r1:8b",
    base_url="http://localhost:11434",
    temperature=0.5,
    num_predict=512
)

# Self-Ask with Search 也是 LangChain 中的一个有用的代理类型（SELF_ASK_WITH_SEARCH）。它利用一种叫做 “Follow-up Question（追问）”加“Intermediate Answer（中间答案）”的技巧，来辅助大模型寻找事实性问题的过渡性答案，从而引出最终答案。
search = TavilySearch(
    name="web_search",
    description="搜索网络获取最新信息，适用于新闻、天气、事实查询等",
    max_results=2  # 对小模型来说，结果少一些更容易处理
)

tools = [
    Tool(
        name="Intermediate Answer", 
        func=search.run,
        description="useful for when you need to ask with search",
    )
]

self_ask_with_search = initialize_agent(
    tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, 
    verbose=True,
    handle_parsing_errors=True  # 添加这个参数来处理解析错误
)
# 使用try-except块来捕获可能的错误
try:
    question = "请找出使用玫瑰作为国花的国家，然后告诉我这些国家的首都在哪里。请按照格式要求逐步思考和回答。"
    result = self_ask_with_search.invoke(question)
    print(f"结果: {result}")
except Exception as e:
    print(f"\n=== 执行出错: {type(e).__name__} ===")
